package com.itheima.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itheima.dao.ModuleDao;
import com.itheima.domain.Module;
import com.itheima.service.ModuleService;
import com.itheima.utils.MybatisUtil;
import org.apache.ibatis.session.SqlSession;

import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class ModuleServiceImpl implements ModuleService {
    @Override
    public PageInfo<Module> findByPage(int currentPage, int pageSize) {
        SqlSession sqlSession = null;
        PageInfo<Module> info=null;
        try {
            //1 通过MybatisUtil工厂类获取SqlSession对象
            sqlSession = MybatisUtil.getSqlSession();
            //2 通过MybatisUtil工厂类获取dao接口的代理对象
            ModuleDao moduleDao = MybatisUtil.getMapper(sqlSession, ModuleDao.class);
            //3 执行操作释放资源
            //3.1 在查询所有之前设置分页参数
            PageHelper.startPage(currentPage,pageSize);
            //3.2 查询所有
            List<Module> list = moduleDao.findAll();
            //3.3 封装分页结果
            info=new PageInfo<>(list);
        }finally {
            //释放资源
            MybatisUtil.close(sqlSession);
        }
        return info;
    }

    @Override
    public void save(Module module) {
        SqlSession sqlSession = null;
        try {
            //1.通过MybatisUtil工厂类获取SQLSession对象
            sqlSession = MybatisUtil.getSqlSession();
            //2.通过MybatisUtil获取dao接口代理对象
            ModuleDao moduleDao = MybatisUtil.getMapper(sqlSession, ModuleDao.class);
            //设置主键唯一id
            String id = UUID.randomUUID().toString().replace("-", "");
            module.setId(id);
            //3. 执行操作释放资源
            //3.1执行操作
            moduleDao.save(module);
            //3.2提交事务
            MybatisUtil.commit(sqlSession);
        } finally {
            //释放资源
            MybatisUtil.close(sqlSession);
        }
    }

    @Override
    public Module findById(String moduleId) {
        SqlSession sqlSession = null;
        Module module = null;
        try {
            //1 通过MybatisUtil工厂类获取SqlSession对象
            sqlSession = MybatisUtil.getSqlSession();
            //2 通过MybatisUtil工厂类获取dao接口的代理对象
            ModuleDao moduleDao = MybatisUtil.getMapper(sqlSession, ModuleDao.class);
            //3 执行操作释放资源
            //3.1 在查询所有之前设置分页参数
            module = moduleDao.findById(moduleId);
        }finally {
            //释放资源
            MybatisUtil.close(sqlSession);
        }
        return module;
    }

    @Override
    public void edit(Module module) {
        SqlSession sqlSession = null;
        try {
            //1.通过MybatisUtil工厂类获取SQLSession对象
            sqlSession = MybatisUtil.getSqlSession();
            //2.通过MybatisUtil获取dao接口代理对象
            ModuleDao moduleDao = MybatisUtil.getMapper(sqlSession, ModuleDao.class);
            //3. 执行操作释放资源
            //3.1执行操作
            moduleDao.update(module);
            //3.2提交事务
            MybatisUtil.commit(sqlSession);
        } finally {
            //释放资源
            MybatisUtil.close(sqlSession);
        }
    }

    @Override
    public void delete(String[] ids) {
        SqlSession sqlSession = null;
        try {
            //1.通过MybatisUtil工厂类获取SQLSession对象
            sqlSession = MybatisUtil.getSqlSession();
            //2.通过MybatisUtil获取dao接口代理对象
            ModuleDao moduleDao = MybatisUtil.getMapper(sqlSession, ModuleDao.class);
            //3. 执行操作释放资源
            //3.1执行操作
            Stream.of(ids).forEach(id->moduleDao.delete(id));
            //3.2提交事务
            MybatisUtil.commit(sqlSession);
        } finally {
            //释放资源
            MybatisUtil.close(sqlSession);
        }
    }

    @Override
    public List<Module> findAll() {
        SqlSession sqlSession = null;
        List<Module> list=null;
        try {
            //1 通过MybatisUtil工厂类获取SqlSession对象
            sqlSession = MybatisUtil.getSqlSession();
            //2 通过MybatisUtil工厂类获取dao接口的代理对象
            ModuleDao moduleDao = MybatisUtil.getMapper(sqlSession, ModuleDao.class);
            //3 执行操作释放资源
            list=moduleDao.findAll();
        }finally {
            //释放资源
            MybatisUtil.close(sqlSession);
        }
        return list;
    }

    //根据角色id初始化树形控件
    @Override
    public List<Map<String, Object>> findModulesByRoleId(String roleId) {
        List<Map<String, Object>> list = null;
        SqlSession sqlSession = null;
        try {
            //1 通过MybatisUtil工厂类获取SqlSession对象
            sqlSession = MybatisUtil.getSqlSession();
            //2 通过MybatisUtil工厂类获取dao接口的代理对象
            ModuleDao moduleDao = MybatisUtil.getMapper(sqlSession, ModuleDao.class);
            //3 执行操作释放资源
            //3.1 在查询所有之前设置分页参数
            list = moduleDao.findModulesByRoleId(roleId);
        }finally {
            //释放资源
            MybatisUtil.close(sqlSession);
        }
        return list;
    }

    @Override
    public List<Module> findMenu(String userId) {
        SqlSession sqlSession = null;
        List<Module> list=null;
        try {
            //1 通过MybatisUtil工厂类获取SqlSession对象
            sqlSession = MybatisUtil.getSqlSession();
            //2 通过MybatisUtil工厂类获取dao接口的代理对象
            ModuleDao moduleDao = MybatisUtil.getMapper(sqlSession, ModuleDao.class);
            //3 执行操作释放资源
            //集合中包含了一级菜单和二级菜单
            List<Module> modules=moduleDao.findMenuByUserId(userId);
            //处理数据:将list集合中module分出一级菜单和二级菜单,并且把二级菜单设置到对应的一级菜单children下
            //3.1 找出一级菜单
            list = modules.stream()
                    .filter(module -> module.getCtype() == 0)
                    .collect(Collectors.toList());
            //3.2 遍历一级菜单,根据二级菜单的parentId和一级菜单的id是否相等找出对应的二级菜单
            for (Module module : list) {
                List<Module> children = modules.stream()
                        .filter(child -> module.getId().equals(child.getParentId()))
                        .collect(Collectors.toList());
                //将二级菜单设置到一级菜单的children中
                module.setChildren(children);
            }
            //4 返回结果并释放资源
            MybatisUtil.commit(sqlSession);
        }finally {
            //释放资源
            MybatisUtil.close(sqlSession);
        }
        return list;
    }

    @Override
    public List<String> findPermissionByUserId(String userId) {
        SqlSession sqlSession = null;
        List<String> curls=null;
        try {
            //1 通过MybatisUtil工厂类获取SqlSession对象
            sqlSession = MybatisUtil.getSqlSession();
            //2 通过MybatisUtil工厂类获取dao接口的代理对象
            ModuleDao moduleDao = MybatisUtil.getMapper(sqlSession, ModuleDao.class);
            //3 执行操作释放资源
            curls=moduleDao.findPermissionByUserId(userId);
        }finally {
            //释放资源
            MybatisUtil.close(sqlSession);
        }
        return curls;
    }
}
